﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using padnug.Domain;
using PadnugRepository;
using PadnugService;
using PadnugRepositoryInterfaces;
using System.Web.Profile;
namespace padnug
{
    public class PadnugProfileProvider : ProfileProvider
    {
        private IPadnugProfileRepository repository;
        private IPadnugProfileService padnugProfileService;
        //public string FirstName { get; set; }
        //public string LastName { get; set; }
        //public string Email { get; set; }

        public PadnugProfileProvider()
        {
            repository = new PadnugProfileRepository();
            padnugProfileService = new PadnugProfileServce(repository);
        }

        #region Overrides of SettingsProvider

        /// <summary>
        /// Returns the collection of settings property values for the specified application instance and settings property group.
        /// </summary>
        /// <returns>
        /// A <see cref="T:System.Configuration.SettingsPropertyValueCollection" /> containing the values for the specified settings property group.
        /// </returns>
        /// <param name="context">
        /// A <see cref="T:System.Configuration.SettingsContext" /> describing the current application use.
        ///                 </param>
        /// <param name="collection">
        /// A <see cref="T:System.Configuration.SettingsPropertyCollection" /> containing the settings property group whose values are to be retrieved.
        /// </param><filterpriority>2</filterpriority>
        public override SettingsPropertyValueCollection GetPropertyValues(SettingsContext context, SettingsPropertyCollection collection)
        {
            SettingsPropertyValueCollection svc = new SettingsPropertyValueCollection();
            if (collection == null || collection.Count < 1 || context == null)
                return svc;
            if(HttpContext.Current.Session["Profile"] != null)
            {
                return (SettingsPropertyValueCollection) HttpContext.Current.Session["Profile"];
            }

            //PadnugUserProfile data = repository.FetchProfileData(context["UserName"].ToString(),null,!(bool)context["IsAuthenticated"]);
            PadnugUserProfile data = padnugProfileService.FetchProfileData(context["UserName"].ToString(), null, !(bool)context["IsAuthenticated"]);
            foreach (SettingsProperty pr in collection)
            {
                SettingsPropertyValue spv = new SettingsPropertyValue(pr);
                
                switch(pr.Name)
                {
                    case "Email":
                        spv.PropertyValue = data.Email;
                        break;
                    case "FirstName":
                        spv.PropertyValue = data.FirstName;
                        break;
                    case "ID":
                        spv.PropertyValue = data.ID;
                        break;
                    case "LastName":
                        spv.PropertyValue = data.LastName;
                        break;
                }
                svc.Add(spv);
            }
            HttpContext.Current.Session["Profile"] = svc;
            return svc;
        }

        /// <summary>
        /// Sets the values of the specified group of property settings.
        /// </summary>
        /// <param name="context">
        /// A <see cref="T:System.Configuration.SettingsContext" /> describing the current application usage.
        /// </param>
        /// <param name="collection">
        /// A <see cref="T:System.Configuration.SettingsPropertyValueCollection" /> representing the group of property settings to set.
        /// </param><filterpriority>2</filterpriority>
        public override void SetPropertyValues(SettingsContext context, SettingsPropertyValueCollection collection)
        {
            //throw new System.NotImplementedException();
        }

        /// <summary>
        ///                     Gets or sets the name of the currently running application.
        /// </summary>
        /// <returns>
        ///                     A <see cref="T:System.String" /> that contains the application's shortened name, which does not contain a full path or extension, for example, SimpleAppSettings.
        /// </returns>
        /// <filterpriority>2</filterpriority>
        public override string ApplicationName
        {
            get { throw new System.NotImplementedException(); }
            set { throw new System.NotImplementedException(); }
        }

        #endregion

        #region Overrides of ProfileProvider

        /// <summary>
        ///                     When overridden in a derived class, deletes profile properties and information for the supplied list of profiles.
        /// </summary>
        /// <returns>
        ///                     The number of profiles deleted from the data source.
        /// </returns>
        /// <param name="profiles">
        ///                     A <see cref="T:System.Web.Profile.ProfileInfoCollection" />  of information about profiles that are to be deleted.
        ///                 </param>
        public override int DeleteProfiles(ProfileInfoCollection profiles)
        {
            throw new System.NotImplementedException();
        }

        /// <summary>
        ///                     When overridden in a derived class, deletes profile properties and information for profiles that match the supplied list of user names.
        /// </summary>
        /// <returns>
        ///                     The number of profiles deleted from the data source.
        /// </returns>
        /// <param name="usernames">
        ///                     A string array of user names for profiles to be deleted.
        ///                 </param>
        public override int DeleteProfiles(string[] usernames)
        {
            throw new System.NotImplementedException();
        }

        /// <summary>
        ///                     When overridden in a derived class, deletes all user-profile data for profiles in which the last activity date occurred before the specified date.
        /// </summary>
        /// <returns>
        ///                     The number of profiles deleted from the data source.
        /// </returns>
        /// <param name="authenticationOption">
        ///                     One of the <see cref="T:System.Web.Profile.ProfileAuthenticationOption" /> values, specifying whether anonymous, authenticated, or both types of profiles are deleted.
        ///                 </param>
        /// <param name="userInactiveSinceDate">
        ///                     A <see cref="T:System.DateTime" /> that identifies which user profiles are considered inactive. If the <see cref="P:System.Web.Profile.ProfileInfo.LastActivityDate" />  value of a user profile occurs on or before this date and time, the profile is considered inactive.
        ///                 </param>
        public override int DeleteInactiveProfiles(ProfileAuthenticationOption authenticationOption, DateTime userInactiveSinceDate)
        {
            throw new System.NotImplementedException();
        }

        /// <summary>
        ///                     When overridden in a derived class, returns the number of profiles in which the last activity date occurred on or before the specified date.
        /// </summary>
        /// <returns>
        ///                     The number of profiles in which the last activity date occurred on or before the specified date.
        /// </returns>
        /// <param name="authenticationOption">
        ///                     One of the <see cref="T:System.Web.Profile.ProfileAuthenticationOption" /> values, specifying whether anonymous, authenticated, or both types of profiles are returned.
        ///                 </param>
        /// <param name="userInactiveSinceDate">
        ///                     A <see cref="T:System.DateTime" /> that identifies which user profiles are considered inactive. If the <see cref="P:System.Web.Profile.ProfileInfo.LastActivityDate" />  of a user profile occurs on or before this date and time, the profile is considered inactive.
        ///                 </param>
        public override int GetNumberOfInactiveProfiles(ProfileAuthenticationOption authenticationOption, DateTime userInactiveSinceDate)
        {
            throw new System.NotImplementedException();
        }

        /// <summary>
        ///                     When overridden in a derived class, retrieves user profile data for all profiles in the data source.
        /// </summary>
        /// <returns>
        ///                     A <see cref="T:System.Web.Profile.ProfileInfoCollection" /> containing user-profile information for all profiles in the data source.
        /// </returns>
        /// <param name="authenticationOption">
        ///                     One of the <see cref="T:System.Web.Profile.ProfileAuthenticationOption" /> values, specifying whether anonymous, authenticated, or both types of profiles are returned.
        ///                 </param>
        /// <param name="pageIndex">
        ///                     The index of the page of results to return.
        ///                 </param>
        /// <param name="pageSize">
        ///                     The size of the page of results to return.
        ///                 </param>
        /// <param name="totalRecords">
        ///                     When this method returns, contains the total number of profiles.
        ///                 </param>
        public override ProfileInfoCollection GetAllProfiles(ProfileAuthenticationOption authenticationOption, int pageIndex, int pageSize, out int totalRecords)
        {
            throw new System.NotImplementedException();
        }

        /// <summary>
        ///                     When overridden in a derived class, retrieves user-profile data from the data source for profiles in which the last activity date occurred on or before the specified date.
        /// </summary>
        /// <returns>
        ///                     A <see cref="T:System.Web.Profile.ProfileInfoCollection" /> containing user-profile information about the inactive profiles.
        /// </returns>
        /// <param name="authenticationOption">
        ///                     One of the <see cref="T:System.Web.Profile.ProfileAuthenticationOption" /> values, specifying whether anonymous, authenticated, or both types of profiles are returned.
        ///                 </param>
        /// <param name="userInactiveSinceDate">
        ///                     A <see cref="T:System.DateTime" /> that identifies which user profiles are considered inactive. If the <see cref="P:System.Web.Profile.ProfileInfo.LastActivityDate" />  of a user profile occurs on or before this date and time, the profile is considered inactive.
        ///                 </param>
        /// <param name="pageIndex">
        ///                     The index of the page of results to return.
        ///                 </param>
        /// <param name="pageSize">
        ///                     The size of the page of results to return.
        ///                 </param>
        /// <param name="totalRecords">
        ///                     When this method returns, contains the total number of profiles.
        ///                 </param>
        public override ProfileInfoCollection GetAllInactiveProfiles(ProfileAuthenticationOption authenticationOption, DateTime userInactiveSinceDate, int pageIndex, int pageSize, out int totalRecords)
        {
            throw new System.NotImplementedException();
        }

        /// <summary>
        ///                     When overridden in a derived class, retrieves profile information for profiles in which the user name matches the specified user names.
        /// </summary>
        /// <returns>
        ///                     A <see cref="T:System.Web.Profile.ProfileInfoCollection" /> containing user-profile information for profiles where the user name matches the supplied <paramref name="usernameToMatch" /> parameter.
        /// </returns>
        /// <param name="authenticationOption">
        ///                     One of the <see cref="T:System.Web.Profile.ProfileAuthenticationOption" /> values, specifying whether anonymous, authenticated, or both types of profiles are returned.
        ///                 </param>
        /// <param name="usernameToMatch">
        ///                     The user name to search for.
        ///                 </param>
        /// <param name="pageIndex">
        ///                     The index of the page of results to return.
        ///                 </param>
        /// <param name="pageSize">
        ///                     The size of the page of results to return.
        ///                 </param>
        /// <param name="totalRecords">
        ///                     When this method returns, contains the total number of profiles.
        ///                 </param>
        public override ProfileInfoCollection FindProfilesByUserName(ProfileAuthenticationOption authenticationOption, string usernameToMatch, int pageIndex, int pageSize, out int totalRecords)
        {
            throw new System.NotImplementedException();
        }

        /// <summary>
        ///                     When overridden in a derived class, retrieves profile information for profiles in which the last activity date occurred on or before the specified date and the user name matches the specified user name.
        /// </summary>
        /// <returns>
        ///                     A <see cref="T:System.Web.Profile.ProfileInfoCollection" /> containing user profile information for inactive profiles where the user name matches the supplied <paramref name="usernameToMatch" /> parameter.
        /// </returns>
        /// <param name="authenticationOption">
        ///                     One of the <see cref="T:System.Web.Profile.ProfileAuthenticationOption" /> values, specifying whether anonymous, authenticated, or both types of profiles are returned.
        ///                 </param>
        /// <param name="usernameToMatch">
        ///                     The user name to search for.
        ///                 </param>
        /// <param name="userInactiveSinceDate">
        ///                     A <see cref="T:System.DateTime" /> that identifies which user profiles are considered inactive. If the <see cref="P:System.Web.Profile.ProfileInfo.LastActivityDate" /> value of a user profile occurs on or before this date and time, the profile is considered inactive.
        ///                 </param>
        /// <param name="pageIndex">
        ///                     The index of the page of results to return.
        ///                 </param>
        /// <param name="pageSize">
        ///                     The size of the page of results to return.
        ///                 </param>
        /// <param name="totalRecords">
        ///                     When this method returns, contains the total number of profiles.
        ///                 </param>
        public override ProfileInfoCollection FindInactiveProfilesByUserName(ProfileAuthenticationOption authenticationOption, string usernameToMatch, DateTime userInactiveSinceDate, int pageIndex, int pageSize, out int totalRecords)
        {
            throw new System.NotImplementedException();
        }

        #endregion
    }
}
